# 多态——指的是：多种状态，即完成某个行为时，使用不同的对象会得到不同的状态
# 多态常作用在继承关系上
# 父类用来确定用哪些方法
# 具体的方法实现，由子类自行决定
# 这种写法，就叫做抽象类(也可以称之为接口)
# 抽象类:含有抽象方法的类称之为抽象类
# 抽象方法:方法体是空实现的(pass)称之为抽象方法


# 演示面向对象的多态特性以及抽象类(接口)的使用
class Animal:
    def speak(self):
        pass

# 狗叫
class Dog(Animal):
    def speak(self):
        print("汪汪汪")

# 猫叫
class Cat(Animal):
    def speak(self):
        print("喵喵喵")

def make_noise(animal:Animal):
    # 制造点噪音，需要传入 Animal 对象
    animal.speak()

# 演示多态，使用两个子类对象来调用函数
dog = Dog()
cat = Cat()
make_noise(dog)
make_noise(cat)

# 抽象类(接口)——用于做顶层设计使用(设计标准)，以便子类做具体实现
# 抽象类就好比定义了一个标准，包含了一些抽象的方法，要求子类必须实现
# 演示抽象类

# 顶层设计——抽象类
class AC:
    def cool_wind(self):
        # 制冷
        pass

    def hot_wind(self):
        # 制热
        pass
    def swing_l_r(self):
        # 左右摆风
        pass

# 继承父类，复写具体实现——是一种软性约束，要求子类必须复写
class MideaAC(AC):
    def cool_wind(self):
        print("美的制冷")

    def hot_wind(self):
        print("美的制热")

    def swing_l_r(self):
        print("美的左右摆风")

class GreeAC(AC):
    def cool_wind(self):
        print("格力制冷")

    def hot_wind(self):
        print("格力制热")

    def swing_l_r(self):
        print("格力左右摆风")

# 构造函数
def make_cool(ac:AC):
    ac.cool_wind()

def make_hot(ac:AC):
    ac.hot_wind()

def make_swing(ac:AC):
    ac.swing_l_r()

midea_ac = MideaAC()
gree_ac = GreeAC()

make_cool(midea_ac)
make_cool(gree_ac)

make_hot(midea_ac)
make_hot(gree_ac)

make_swing(midea_ac)
make_swing(gree_ac)

